package cn.kgc.websocket;

import io.netty.channel.ChannelHandlerContext;
import io.netty.channel.ChannelInboundHandlerAdapter;
import io.netty.handler.timeout.IdleState;
import io.netty.handler.timeout.IdleStateEvent;

/**
 * @author YC
 * 心跳检测与处理
 */
public class HeartBeatHandler extends ChannelInboundHandlerAdapter {

    /**
     * 用户事件触发
     *
     * @param ctx 上下文
     * @param evt 事件
     * @throws Exception 抛出异常
     */
    @Override
    public void userEventTriggered(ChannelHandlerContext ctx, Object evt) throws Exception {
        // 捕获IdleStateHandler触发的IdleStateEvent事件
        if (evt instanceof IdleStateEvent) {
            IdleStateEvent idleStateEvent = (IdleStateEvent) evt;
            // 判断空闲类型
            if (idleStateEvent.state() == IdleState.READER_IDLE) {
                UserChannelSession.print("用户" + ctx.channel().id().asLongText() + "触发读空闲，关闭连接");
            } else if (idleStateEvent.state() == IdleState.WRITER_IDLE) {
                UserChannelSession.print("用户" + ctx.channel().id().asLongText() + "触发写空闲，关闭连接");
            } else if (idleStateEvent.state() == IdleState.ALL_IDLE) {
                UserChannelSession.print("用户" + ctx.channel().id().asLongText() + "触发读写空闲，关闭连接");
            }
            // 关闭空闲通道
            ctx.channel().close();
        } else {
            // 非空闲事件，传递给下一个处理器
            super.userEventTriggered(ctx, evt);
        }
    }

}
